/***************************************************************************************
 * 本程序由Carter创建并免费开源共享
 * 你可以任意查看、使用和修改，并应用到自己的项目之中
 * 程序版权归Carter所有，任何人或组织不得将其据为己有
 *
 * 程序名称：				四轴无人机控制系统（遥控端）
 * 程序创建时间：			2025.04.19
 * 当前程序版本：			V1.0
 * 当前版本发布时间：		2025.04.19
 *
 * 项目地址网站：		https://gitee.com/fan-yiming
 *
 * 功能简介：
 * 1. 基于STM32的四轴无人机遥控程序
 * 2. 集成NRF24L01无线模块，实现遥控器与无人机之间的数据通信。
 * 3. 内置定时器中断，确保系统实时性。
 * 4. 油门摇杆拉低+长按KEY1 3秒解锁 长按KEY2 3秒退出紧急模式
 * 5. 串口打印每秒丢包个数，回传的无人机飞行状态、姿态
 *
 * 使用说明：
 * - 通过串口打印调试信息，便于开发与故障排查。
 *
 * 如果你发现程序中的漏洞或者笔误，可通过QQ向我反馈：960088610
 ***************************************************************************************/

#include "global.h"

void RCC_Configuration(void)
{
    RCC_DeInit(); // 复位RCC寄存器

    // 1. 启用HSI（内部8MHz时钟）
    RCC_HSICmd(ENABLE);
    while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET)
        ; // 等待HSI就绪

    // 2. 配置PLL：HSI/2 = 4MHz输入，倍频9倍得到36MHz
    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_9);
    RCC_PLLCmd(ENABLE);
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
        ; // 等待PLL锁定

    // 3. 配置FLASH等待周期（36MHz需1个等待周期）
    FLASH_SetLatency(FLASH_Latency_1);
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    // 4. 配置总线分频
    RCC_HCLKConfig(RCC_SYSCLK_Div1); // AHB时钟 = 36MHz
    RCC_PCLK1Config(RCC_HCLK_Div1);  // APB1时钟 = 36MHz（最大36MHz）
    RCC_PCLK2Config(RCC_HCLK_Div1);  // APB2时钟 = 36MHz（最大72MHz）

    // 5. 切换系统时钟到PLL
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    while (RCC_GetSYSCLKSource() != 0x08)
        ; // 等待切换完成

    // 6. 更新系统时钟变量（关键！否则库函数无法正确计算时序）
    SystemCoreClockUpdate();
}

int main(void)
{
    RCC_Configuration();                            // 初始化系统时钟
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 配置NVIC为分组2 即抢占优先级范围：0~3，响应优先级范围：0~3
    usartDebug_init();                              // 初始化串口调试
    // RCC_APB2PeriphClockCmd(TEST_RCC, ENABLE);
    // GPIO_InitTypeDef GPIO_InitStructure;
    // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    // GPIO_InitStructure.GPIO_Pin = TEST_PIN_TRIGGER;
    // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    // GPIO_Init(TEST_PORT, &GPIO_InitStructure);

    spi_init();      // 初始化spi
    nrf24l01_init(); // 初始化nrf24l01
    printf("NRF24L01 setTxMode start.\r\n");
    nrf24l01_setTxMode(); // 设置为发送模式
    printf("NRF24L01 setTxMode completed.\r\n");
    adc_init();            // 初始化adc
    i2c_init();            // 初始化i2c
    btn_init();            // 初始化按钮
    beep_init();           // 初始化蜂鸣器
    txRemote_fliterInit(); // 初始化遥控器滤波器
    txRemote_loadOffset(); // 加载遥控偏移量
    tim_init();            // 初始化定时器 5ms
    beep_setDuration(80);  // 开机蜂鸣器响80*5ms

    while (1)
    {
        printf("%d, %d, %f, %f, %f\r\n", txRemoteLost, rxRemote.state, rxRemote.roll, rxRemote.pitch, rxRemote.yaw);
        delay_ms(7);
    }
}
